import heapq
# 整个棋盘完成染色时间 = max（到某点的最短染色时间+该点需要的染色时间）
# 最短路径问题
dx=[(1,0),(-1,0),(0,1),(0,-1)]

n,m=map(int,input().split())
mp=[[] for _ in range(n)]

for i in range(n):
    # 记录权重
    mp[i]=list(map(int,input().split()))
INF=float('inf')
# 到某点的最短染色时间
dis=[[INF] *(m+1) for _ in range(n+1)]
dis[0][0]=0

q=[]
heapq.heappush(q,(0,0,0))

while q:
    # 取最少的完成时间
    time,x,y=heapq.heappop(q)
    # 计算当前方格所需要的时间
    cnt=time+mp[x][y]
    for xx,yy in dx:
        nx,ny=x+xx,y+yy
        if 0<=nx<n and 0<=ny<m:
            # 到该点的最短染色时间 = 完成上一个方格所需要的时间
            new_time=cnt
            # 到该点的最短染色时间 小于 存储
            if new_time<dis[nx][ny]:
                dis[nx][ny]=new_time
                heapq.heappush(q,(new_time,nx,ny))

max_time=0
for i in range(n):
    for j in range(m):
        # 当前节点被处理过
        if dis[i][j] != INF:
            # 更新最大值 = max(到某点的最短染色时间+该点需要的染色时间)
            max_time=max(max_time,dis[i][j]+mp[i][j])

print(max_time)
